﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyQuanCafe.BusinessLogic;
using QuanLyQuanCafe.BusinessObject;

namespace QuanLyQuanCafe
{
    public partial class FrmGopBan : Form
    {
        public FrmGopBan()
        {
            InitializeComponent();
        }

        private KhuVucBL khuvucBL = new KhuVucBL();
        private BanBL banBL = new BanBL();
        private HoaDonBL hoadonBL = new HoaDonBL();
        private void FrmGopBan_Load(object sender, EventArgs e)
        {
            tabControl1.SelectedIndex = 0;
            cbKhuVuc.DisplayMember = "TenKV";
            cbKhuVuc.ValueMember = "MaKV";
            cbKhuVuc.DataSource = khuvucBL.DSKVBanHang();
            cbKhuVucTach.DisplayMember = "TenKV";
            cbKhuVucTach.ValueMember = "MaKV";
            cbKhuVucTach.DataSource = khuvucBL.DSKVBanHang();
        }

        private void cbKhuVuc_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadKV(cbKhuVuc.SelectedValue.ToString());
        }

        private void LoadKV(string makv)
        {
            try
            {
                flowLayoutPanelGopBan.Controls.Clear();
                DataTable dt = banBL.DSBanGopTheoKV(makv);
                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        CheckBox checkBan = new CheckBox();
                        checkBan.Text = "Bàn " + dt.Rows[i]["GopBan"].ToString();
                        checkBan.Name = dt.Rows[i]["GopBan"].ToString();
                        checkBan.Width = flowLayoutPanelGopBan.Width/4 - 8;

                        flowLayoutPanelGopBan.Controls.Add(checkBan);
                    }
                }
            }
            catch { }
        }
        #region Thuật toán Merge Sort
        // Returns the first half of the given array.
        public static int[] leftHalf(int[] a)
        {
            int size1 = a.Length / 2;
            int[] left = new int[size1];
            for (int i = 0; i < size1; ++i)
            {
                left[i] = a[i];
            }
            return left;
        }

        // Returns the second half of the given array.
        public static int[] rightHalf(int[] a)
        {
            int size1 = a.Length / 2;
            int size2 = a.Length - size1;
            int[] right = new int[size2];
            for (int i = 0; i < size2; ++i)
            {
                right[i] = a[i + size1];
            }
            return right;
        }
        public static void merge(int[] result, int[] left, int[] right)
        {
            int i1 = 0;   // index into left array
            int i2 = 0;   // index into right array

            for (int i = 0; i < result.Length; i++)
            {
                if (i2 >= right.Length || (i1 < left.Length && left[i1] <= right[i2]))
                {
                    result[i] = left[i1];    // take from left
                    i1++;
                }
                else
                {
                    result[i] = right[i2];   // take from right
                    i2++;
                }
            }
        }

        // Rearranges the elements of a into sorted order using
        // the merge sort algorithm (recursive).
        public static void mergeSort(int[] a)
        {
            if (a.Length >= 2)
            {
                // split array into two halves
                int[] left = leftHalf(a);
                int[] right = rightHalf(a);

                // sort the two halves
                mergeSort(left);
                mergeSort(right);

                // merge the sorted halves into a sorted whole
                merge(a, left, right);
            }
        }
        #endregion

        private void btLuu_Click(object sender, EventArgs e)
        {
            DataTable dt = banBL.DSBanTheoMaKV(cbKhuVuc.SelectedValue.ToString());
            string maban;
            int sobangop = 0;
            string bangop="";
            int sobangoimon = 0;
            string bancodulieu;
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    maban = dt.Rows[i]["MaBan"].ToString();
                    if (((CheckBox)flowLayoutPanelGopBan.Controls[maban]).Checked == true)
                        {
                            sobangop++;
                            if (bangop == "")
                                bangop += maban;
                            else bangop += "," + maban;
                        }
                }
            }
            if (sobangop > 1)
            {
                string[] ban = bangop.Split(new char[]{','});
                bancodulieu = ban[0];
                for (int i = 0; i < ban.Count(); i++)
                {
                    //kiểm tra xem có bàn nào đã gọi món chưa??
                    DataTable dt1 = hoadonBL.CheckGoiMon(ban[i]);
                    if (dt1.Rows.Count > 0)
                    {
                        sobangoimon++;
                        bancodulieu = ban[i];
                    }
                }
                if (sobangoimon > 1)
                {
                    MessageBox.Show("Chỉ Được Gộp 1 Gàn Chưa Thanh Toán!", "Quản Lý Quán Café", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
                }
                else if (sobangoimon == 1)
                {
                    DialogResult result = MessageBox.Show("Bạn Có Muốn Gộp " + sobangop + " Bàn Trên Lại Không?", "Quản Lý Quán Café", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {
                        for (int i = 0; i < ban.Count(); i++)
                        {
                            if (int.Parse(ban[0].ToString()) == int.Parse(bancodulieu.ToString()))
                                banBL.UpGopBan(ban[i].ToString(), ban[0].ToString());
                            else
                            {
                                //Cập nhật lại bàn trong hóa đơn
                                hoadonBL.ChuyenHD(bancodulieu.ToString(), ban[0].ToString());
                                //Chuyển lại trạng thái bàn trống và bàn gọi món
                                banBL.CapNhatTinhTrangBan(int.Parse(bancodulieu.ToString()), 1);
                                banBL.CapNhatTinhTrangBan(int.Parse(ban[0].ToString()), 4);

                                banBL.UpGopBan(ban[i].ToString(), ban[0].ToString());
                            }
                        }
                        Close();
                    }
                }
                else
                {
                    DialogResult result = MessageBox.Show("Bạn Có Muốn Gộp " + sobangop + " Bàn Trên Lại Không?", "Quản Lý Quán Café", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {

                        for (int i = 0; i < ban.Count(); i++)
                        {
                            banBL.UpGopBan(ban[i].ToString(), ban[0].ToString());
                        }
                        Close();
                    }
                }

            }
            else MessageBox.Show("Bạn Phải Chọn Ít Nhất 2 Bàn Để Gộp Lại!", "Quản Lý Quán Café", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

        private void btHuy_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void cbKhuVucTach_SelectedIndexChanged(object sender, EventArgs e)
        {
            string makv = cbKhuVucTach.SelectedValue.ToString();
            DataTable dt = banBL.DSBanGopTheoKV(makv);
            string bangop="";
            cbBanTach.Items.Clear();
            if (dt.Rows.Count > 0)
            {
                for(int i=0;i<dt.Rows.Count;i++)
                {
                    DataTable dt1 = banBL.CheckGopBan(dt.Rows[i]["GopBan"].ToString());
                    if(dt1.Rows.Count>1)
                    {
                        for (int j = 0; j < dt1.Rows.Count; j++)
                        {
                            if(j==0)
                            bangop = "Bàn" + dt1.Rows[j]["MaBan"].ToString();
                            else bangop += "+" +dt1.Rows[j]["MaBan"].ToString();
                        }
                        cbBanTach.Items.Add(bangop);
                    }
                }

            }
            if (cbBanTach.Items.Count > 0)
                cbBanTach.SelectedIndex = 0;
        }

         private void btLuuTach_Click(object sender, EventArgs e)
        {
            string bangop="";
            int vitri=0;
            string maban;
            if (cbBanTach.Items.Count > 0)
            {
                bangop = cbBanTach.Text;
                vitri = bangop.IndexOf('+');
                maban = bangop.Substring(3, vitri-3);
                DataTable dt = hoadonBL.CheckGoiMon(maban);
                if (dt.Rows.Count > 0)
                {
                    MessageBox.Show(bangop + " Chưa Thanh Toán. Không Thể Tách.", "Quản Lý Quán Café", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                else
                {
                    DialogResult result = MessageBox.Show("Bạn Có Chắc Muốn Tách " + bangop + " Không?", "Quản Lý Quán Café", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                    {
                        DataTable dt2 = banBL.GetGopBan(maban);
                        if (dt2.Rows.Count > 0)
                        {
                            for (int i = 0; i < dt2.Rows.Count; i++)
                            {
                                banBL.UpGopBan(dt2.Rows[i]["MaBan"].ToString(), dt2.Rows[i]["MaBan"].ToString());
                            }
                        }
                        Close();
                    }
                }
            }
            else
            {
                MessageBox.Show("Bạn Chưa Chọn Bàn Cần Tách.", "Quản Lý Quán Café", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }


        private void btHuyTach_Click(object sender, EventArgs e)
        {
            Close();
        }

       
    }
}
